/**
 * 文件名：@SoaServiceFeatureHandlerMapping.java <br/>
 * 包名：cn.efunbox.afw.soa.spring.cloud <br/>
 * 项目名：afw-soa <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.soa.service.spring;

import java.lang.reflect.Method;
import java.util.Set;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.StringUtils;

import cn.efunbox.afw.soa.service.annotation.SoaService;
import cn.efunbox.afw.web.mvc.springmvc.AbstractFeatureHandlerMapping;

/**
 * 类名：SoaServiceFeatureHandlerMapping  <br />
 *
 * 功能：匹配cn.efunbox.afw.soa.service.annotation.SoaService注解的映射处理器
 *
 * @author xtwin <br />
 * 创建时间：2016年7月20日 下午5:41:46  <br />
 * @version 2016年7月20日
 */
public class SoaServiceFeatureHandlerMapping extends AbstractFeatureHandlerMapping {
	
	// 默认版本号
	private String defaultVersion = "1.0.0";

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月20日 下午5:42:33<br/>
	 * 
	 * @param beanType
	 * @return <br/>
	 * @see org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#isHandler(java.lang.Class)
	 */
	@Override
	protected boolean isHandler(Class<?> beanType) {
		return AnnotationUtils.findAnnotation(beanType, SoaService.class) != null;
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月21日 上午10:05:25<br/>
	 * 
	 * @param method
	 * @param handlerType
	 * @param infs
	 * @return <br/>
	 * @see cn.efunbox.afw.web.mvc.springmvc.AbstractFeatureHandlerMapping#getMappingForMethod(java.lang.reflect.Method, java.lang.Class, java.lang.Class[])
	 */
	@Override
	protected Set<String> getMappingForMethod(Method method, Class<?> handlerType, Class<?>[] interfaces) {
		// 取得注解
		SoaService service = AnnotationUtils.findAnnotation(handlerType, SoaService.class);
		
		Class<?>[] infs = service.interfaces();
		if (infs.length == 0) {
			infs = interfaces;
		}
		
		return super.getMappingForMethod(method, handlerType, infs);
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月21日 上午10:03:13<br/>
	 * 
	 * @param mapping
	 * @param method
	 * @param handlerType
	 * @param inf
	 * @return <br/>
	 * @see cn.efunbox.afw.web.mvc.springmvc.AbstractFeatureHandlerMapping#toFeature(java.lang.String, java.lang.reflect.Method, java.lang.Class, java.lang.Class)
	 */
	@Override
	protected String toFeature(String mapping, Method method, Class<?> handlerType, Class<?> inf) {
		// 取得注解
		SoaService service = AnnotationUtils.findAnnotation(handlerType, SoaService.class);
		
		// 版本号
		String version = service.version();
		if (StringUtils.isEmpty(version)) {
			version = defaultVersion;
		}
		
		// 拼接上版本号
		return super.toFeature(mapping + ":" + version, method, handlerType, inf);
	}
	
	/**
	 * @version 2016年7月20日-下午5:48:36
	 */
	public String getDefaultVersion() {
		return defaultVersion;
	}

	/**
	 * @version 2016年7月20日-下午5:48:36
	 */
	public void setDefaultVersion(String defaultVersion) {
		this.defaultVersion = defaultVersion;
	}
}